/*
cron "40 8,10,12,14 * * *" ZY_big_winner_Mod.js
省钱大赢家之翻翻乐分组版本,兼容资产通知查询的变量，标题为 省钱大赢家之翻翻乐#2 省钱大赢家之翻翻乐#3 省钱大赢家之翻翻乐#4 省钱大赢家之翻翻乐
 */
 //详细说明参考 https://github.com/ccwav/QLScript2.
 const $ = new Env('省钱大赢家之翻翻乐');
 const notify = $.isNode() ? require('./sendNotify') : '';
 //Node.js用户请在jdCookie.js处填写京东ck;
 const jdCookieNode = $.isNode() ? require('./jdCookie.js') : '';
 //IOS等用户直接用NobyDa的jd cookie
 let cookiesArr = [], cookie = '', message = '', linkId = 'WMDf1PTHmh8MYBpD97sieQ', fflLinkId = 'WMDf1PTHmh8MYBpD97sieQ';
 const money = $.isNode() ? (process.env.BIGWINNER_MONEY ? process.env.BIGWINNER_MONEY * 1 : 0.3) : ($.getdata("BIGWINNER_MONEY") ? $.getdata("BIGWINNER_MONEY") * 1 : 0.3)
   const JD_API_HOST = 'https://api.m.jd.com/api';
 if ($.isNode()) {
   Object.keys(jdCookieNode).forEach((item) => {
     cookiesArr.push(jdCookieNode[item])
   })
   if (process.env.JD_DEBUG && process.env.JD_DEBUG === 'false')
     console.log = () => {};
 } else {
   cookiesArr = [
     $.getdata("CookieJD"),
     $.getdata("CookieJD2"),
     ...$.toObj($.getdata("CookiesJD") || "[]").map((item) => item.cookie)].filter((item) => !!item);
 }
 const len = cookiesArr.length;
 
 let MessageUserGp2 = "";
 let MessageUserGp3 = "";
 let MessageUserGp4 = "";
 
 let MessageGp2 = "";
 let MessageGp3 = "";
 let MessageGp4 = "";
 let MessageAll = "";
 
 let userIndex2 = -1;
 let userIndex3 = -1;
 let userIndex4 = -1;
 
 let IndexGp2 = 0;
 let IndexGp3 = 0;
 let IndexGp4 = 0;
 let IndexAll = 0;
 
 let allMessageGp2 = '';
 let allMessageGp3 = '';
 let allMessageGp4 = '';
 let allMessage = '';
 
 let ReturnMessage = "";
 let ReturnMessageTitle = "";
 
 
 
 if ($.isNode() && process.env.BEANCHANGE_USERGP2) {
   MessageUserGp2 = process.env.BEANCHANGE_USERGP2 ? process.env.BEANCHANGE_USERGP2.split('&') : [];
   console.log(`检测到设定了分组推送2`);
 }
 
 if ($.isNode() && process.env.BEANCHANGE_USERGP3) {
   MessageUserGp3 = process.env.BEANCHANGE_USERGP3 ? process.env.BEANCHANGE_USERGP3.split('&') : [];
   console.log(`检测到设定了分组推送3`);
 }
 
 if ($.isNode() && process.env.BEANCHANGE_USERGP4) {
   MessageUserGp4 = process.env.BEANCHANGE_USERGP4 ? process.env.BEANCHANGE_USERGP4.split('&') : [];
   console.log(`检测到设定了分组推送4`);
 }
 
 let strNoRunPin = "";
 let NoRunIndex3=-1;
 if ($.isNode() && process.env.BIGNORUNPIN) {
   strNoRunPin = process.env.BIGNORUNPIN ? process.env.BIGNORUNPIN.split('&') : [];
   console.log(`检测到账号跳过的设定`);
 }
 
 
 let WP_APP_TOKEN_ONE = "";
 if ($.isNode() && process.env.WP_APP_TOKEN_ONE) {
   WP_APP_TOKEN_ONE = process.env.WP_APP_TOKEN_ONE;
 }
 
 !(async() => {
   $.redPacketId = []
   if (!cookiesArr[0]) {
     $.msg($.name, '【提示】请先获取京东账号一cookie\n直接使用NobyDa的京东签到获取', 'https://bean.m.jd.com/', {
       "open-url": "https://bean.m.jd.com/"
     });
     return;
   }
   for (let i = 0; i < len; i++) {
     if (cookiesArr[i]) {
       cookie = cookiesArr[i];
       $.pt_pin = (cookie.match(/pt_pin=([^; ]+)(?=;?)/) && cookie.match(/pt_pin=([^; ]+)(?=;?)/)[1]);
       $.UserName = decodeURIComponent(cookie.match(/pt_pin=(.+?);/) && cookie.match(/pt_pin=(.+?);/)[1]);
       $.index = i + 1;
       $.isLogin = true;
       $.nickName = '';
       
       if (strNoRunPin) {
         NoRunIndex3 = strNoRunPin.findIndex((item) => item === $.pt_pin);
         if (NoRunIndex3 != -1) {	
           console.log(`账号跳过:`+$.UserName);		
           continue;
         }
         NoRunIndex3 = strNoRunPin.findIndex((item) => item === $.UserName);
         if (NoRunIndex3 != -1) {	
           console.log(`账号跳过:`+$.UserName);		
           continue;
         }
       }
       
       
       if (MessageUserGp4) {
         userIndex4 = MessageUserGp4.findIndex((item) => item === $.pt_pin);
       }
       if (MessageUserGp2) {
         userIndex2 = MessageUserGp2.findIndex((item) => item === $.pt_pin);
       }
       if (MessageUserGp3) {
         userIndex3 = MessageUserGp3.findIndex((item) => item === $.pt_pin);
       }
       if (userIndex4 != -1) {
         IndexGp4 += 1;
         ReturnMessageTitle = `【账号${IndexGp4}🆔】${$.nickName || $.UserName}\n`;
       }
       if (userIndex2 != -1) {
         IndexGp2 += 1;
         ReturnMessageTitle = `【账号${IndexGp2}🆔】${$.nickName || $.UserName}\n`;
       }
       if (userIndex3 != -1) {
         IndexGp3 += 1;
         ReturnMessageTitle = `【账号${IndexGp3}🆔】${$.nickName || $.UserName}\n`;
       }
       if (userIndex4 == -1 && userIndex2 == -1 && userIndex3 == -1) {
         IndexAll += 1;
         ReturnMessageTitle = `【账号${IndexAll}🆔】${$.nickName || $.UserName}\n`;
       }
 
       ReturnMessage = "";
 
       console.log(`\n******开始【京东账号${$.index}】${$.nickName || $.UserName}*********\n`);
       await main()
       if (ReturnMessage) {
         
         
         if ($.isNode() && WP_APP_TOKEN_ONE) {
           await notify.sendNotifybyWxPucher(`${$.name}`,`【账号名称】${$.nickName || $.UserName}\n`+`${ReturnMessage}`,`${$.UserName}`);
         }
         
         ReturnMessage = ReturnMessageTitle + ReturnMessage;
         
         if (userIndex4 != -1) {
           allMessageGp4 += ReturnMessage;
         }
 
         if (userIndex2 != -1) {
           allMessageGp2 += ReturnMessage;
         }
         if (userIndex3 != -1) {
           allMessageGp3 += ReturnMessage;
         }
         if (userIndex4 == -1 && userIndex2 == -1 && userIndex3 == -1) {
           allMessage += ReturnMessage;
         }
       }
     }
   }
 
   if ($.isNode() && allMessageGp2) {
     console.log("分组2:" + `\n` + allMessageGp2);
     await notify.sendNotify(`${$.name}#2`, `${allMessageGp2}`, {
       url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
     })
     await $.wait(5000);
   }
   if ($.isNode() && allMessageGp3) {	
     console.log("分组3:" + `\n` + allMessageGp3);
     await notify.sendNotify(`${$.name}#3`, `${allMessageGp3}`, {
       url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
     })
     await $.wait(5000);
   }
   if ($.isNode() && allMessageGp4) {
     console.log("分组4:" + `\n` + allMessageGp4);
     await notify.sendNotify(`${$.name}#4`, `${allMessageGp4}`, {
       url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
     })
     await $.wait(5000);
   }
   if ($.isNode() && allMessage) {
     console.log("其他组:" + `\n` + allMessage);
     await notify.sendNotify(`${$.name}`, `${allMessage}`, {
       url: `https://bean.m.jd.com/beanDetail/index.action?resourceValue=bean`
     })
     await $.wait(5000);
   }
 })()
 .catch((e) => {
   $.log('', `❌ ${$.name}, 失败! 原因: ${e}!`, '')
 })
 .finally(() => {
   $.done();
 })
 
 async function main() {
   try {
     $.canApCashWithDraw = false;
     $.changeReward = true;
     $.canOpenRed = true;
     await gambleHomePage();
     if (!$.time) {
       console.log(`开始进行翻翻乐拿红包\n`)
       await gambleOpenReward(); //打开红包
       if ($.canOpenRed) {
          while (!$.canApCashWithDraw && $.changeReward) {
           await openRedReward();
           await $.wait(1000);					
         } 
         if ($.canApCashWithDraw) {
           //提现
           await openRedReward('gambleObtainReward', $.rewardData.rewardType);
           await apCashWithDraw($.rewardData.id, $.rewardData.poolBaseId, $.rewardData.prizeGroupId, $.rewardData.prizeBaseId, $.rewardData.prizeType);
         }
       }
     }
   } catch (e) {
     $.logErr(e)
   }
 }
 
 //查询剩余多长时间可进行翻翻乐
 function gambleHomePage() {
   const headers = {
     'Host': 'api.m.jd.com',
     'Origin': 'https://openredpacket-jdlite.jd.com',
     'Accept': 'application/json, text/plain, */*',
     'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
     'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
     'Accept-Language': 'zh-cn',
     'Cookie': cookie
   }
   const body = {
     'linkId': fflLinkId
   };
   const options = {
     url: `https://api.m.jd.com/?functionId=gambleHomePage&body=${encodeURIComponent(JSON.stringify(body))}&appid=activities_platform&clientVersion=3.5.0`,
     headers,
   }
   return new Promise(resolve => {
     $.get(options, (err, resp, data) => {
       try {
         if (err) {
           console.log(`${JSON.stringify(err)}`)
           console.log(`${$.name} API请求失败，请检查网路重试`)					
         } else {
           if (data) {
             data = JSON.parse(data);
             if (data['code'] === 0) {
               if (data.data.leftTime === 0) {
                 $.time = data.data.leftTime;
               } else {
                 $.time = (data.data.leftTime / (60 * 1000)).toFixed(2);
               }
               console.log(`\n查询下次翻翻乐剩余时间成功：\n京东账号【${$.UserName}】距开始剩 ${$.time} 分钟`);
             } else {
               console.log(`查询下次翻翻乐剩余时间失败：${JSON.stringify(data)}\n`);
             }
           }
         }
       } catch (e) {
         $.logErr(e, resp)
       }
       finally {
         resolve()
       }
     })
   })
 }
 //打开翻翻乐红包
 function gambleOpenReward() {
   const headers = {
     'Host': 'api.m.jd.com',
     'Origin': 'https://openredpacket-jdlite.jd.com',
     'Accept': 'application/json, text/plain, */*',
     'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
     'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
     'Accept-Language': 'zh-cn',
     "Content-Type": "application/x-www-form-urlencoded",
     'Cookie': cookie
   }
   const body = {
     'linkId': fflLinkId
   };
   const options = {
     url: `https://api.m.jd.com/`,
     headers,
     body: `functionId=gambleOpenReward&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
   }
   return new Promise(resolve => {
     $.post(options, (err, resp, data) => {
       try {
         if (err) {
           console.log(`${JSON.stringify(err)}`)
           console.log(`${$.name} API请求失败，请检查网路重试`)
         } else {
           if (data) {
             data = JSON.parse(data);
             $.rewardData = data.data;
             if (data['code'] === 0) {
               console.log(`翻翻乐打开红包 成功，获得：${data.data.rewardValue}元红包\n`);
             } else {
               console.log(`翻翻乐打开红包 失败：${JSON.stringify(data)}\n`);
               if (data.code === 20007) {
                 $.canOpenRed = false;
                 console.log(`翻翻乐打开红包 失败，今日活动参与次数已达上限`)
               }
             }
           }
         }
       } catch (e) {
         $.logErr(e, resp)
       }
       finally {
         resolve()
       }
     })
   })
 }
 //翻倍红包
 function openRedReward(functionId = 'gambleChangeReward', type) {
   const headers = {
     'Host': 'api.m.jd.com',
     'Origin': 'https://openredpacket-jdlite.jd.com',
     'Accept': 'application/json, text/plain, */*',
     'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
     'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
     'Accept-Language': 'zh-cn',
     "Content-Type": "application/x-www-form-urlencoded",
     'Cookie': cookie
   }
   const body = {
     'linkId': fflLinkId
   };
   if (type)
     body['rewardType'] = type;
   const options = {
     url: `https://api.m.jd.com/`,
     headers,
     body: `functionId=${functionId}&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
   }
   return new Promise(resolve => {
     $.post(options, (err, resp, data) => {
       try {
         if (err) {
           console.log(`${JSON.stringify(err)}`)
           console.log(`${$.name} API请求失败，请检查网路重试`)
           $.changeReward = false;
         } else {
           if (data) {
             console.log(`翻翻乐结果：${data}\n`);
             data = JSON.parse(data);
             if (data['code'] === 0) {
               $.rewardData = data.data;
               if (data.data.rewardState === 1) {
                 if (data.data.rewardValue >= money) {
                   //已翻倍到0.3元，可以提现了
                   $.canApCashWithDraw = true;
                   $.changeReward = false;
                   // message += `${data.data.rewardValue}元现金\n`
                 }
                 if (data.data.rewardType === 1) {
                   console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功，获得：${data.data.rewardValue}元红包\n`);
                 } else if (data.data.rewardType === 2) {
                   console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功，获得：${data.data.rewardValue}元现金\n`);
                   // $.canApCashWithDraw = true;
                 } else {
                   console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 成功，获得：${JSON.stringify(data)}\n`);
                 }
               } else if (data.data.rewardState === 3) {
                 console.log(`翻翻乐 第${data.data.changeTimes}次翻倍 失败，奖品溜走了/(ㄒoㄒ)/~~\n`);
                 $.changeReward = false;
               } else {
                 if (type) {
                   console.log(`翻翻乐领取成功：${data.data.amount}现金\n`)
                   ReturnMessage += `${new Date().getHours()}点：${data.data.amount}现金\n`;
                 } else {
                   console.log(`翻翻乐 翻倍 成功，获得：${JSON.stringify(data)}\n`);
                 }
               }
             } else {
               $.canApCashWithDraw = true;
               $.changeReward = false;
               console.log(`翻翻乐 翻倍 失败：${JSON.stringify(data)}\n`);
             }
           }
         }
       } catch (e) {
         $.logErr(e, resp)
       }
       finally {
         resolve()
       }
     })
   })
 }
 //翻翻乐提现
 function apCashWithDraw(id, poolBaseId, prizeGroupId, prizeBaseId, prizeType) {
   const headers = {
     'Host': 'api.m.jd.com',
     'Origin': 'https://openredpacket-jdlite.jd.com',
     'Accept': 'application/json, text/plain, */*',
     'User-Agent': 'jdltapp;iPhone;3.3.2;14.4.1;network/wifi;Mozilla/5.0 (iPhone; CPU iPhone OS 14_4_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148;supportJDSHWK/1',
     'Referer': `https://618redpacket.jd.com/withdraw?activityId=${linkId}&channel=wjicon&lng=&lat=&sid=&un_area=`,
     'Accept-Language': 'zh-cn',
     "Content-Type": "application/x-www-form-urlencoded",
     'Cookie': cookie
   }
   const body = {
     "businessSource": "GAMBLE",
     "base": {
       id,
       "business": "redEnvelopeDouble",
       poolBaseId,
       prizeGroupId,
       prizeBaseId,
       prizeType
     },
     "linkId": fflLinkId
   };
   const options = {
     url: `https://api.m.jd.com/`,
     headers,
     body: `functionId=apCashWithDraw&body=${encodeURIComponent(JSON.stringify(body))}&t=${+new Date()}&appid=activities_platform&clientVersion=3.5.0`
   }
   return new Promise(resolve => {
     $.post(options, (err, resp, data) => {
       try {
         if (err) {
           console.log(`${JSON.stringify(err)}`)
           console.log(`${$.name} API请求失败，请检查网路重试`)
         } else {
           if (data) {
             data = JSON.parse(data);
             if (data['code'] === 0) {
               if (data['data']['status'] === '310') {
                 console.log(`翻翻乐提现 成功🎉，详情：${JSON.stringify(data)}\n`);
                 ReturnMessage += `提现至微信钱包成功🎉\n\n`;
               } else {
                 console.log(`翻翻乐提现 失败，详情：${JSON.stringify(data)}\n`);
                 ReturnMessage += `提现至微信钱包失败\n详情：${JSON.stringify(data)}\n`;
                 ReturnMessage +="温馨提示: 如果是没有绑定，请至微信搜索京东小程序登录即可.\n"
               }
             } else {
               console.log(`翻翻乐提现 失败：${JSON.stringify(data)}\n`);
               ReturnMessage += `提现至微信钱包失败\n详情：${JSON.stringify(data)}\n\n`;
             }
           }
         }
       } catch (e) {
         $.logErr(e, resp)
       }
       finally {
         resolve()
       }
     })
   })
 }
 // prettier-ignore
 function Env(t, e) {
   class s {
     constructor(t) {
       this.env = t
     }
     send(t, e = "GET") {
       t = "string" == typeof t ? {
         url: t
       }
        : t;
       let s = this.get;
       return "POST" === e && (s = this.post),
       new Promise((e, i) => {
         s.call(this, t, (t, s, r) => {
           t ? i(t) : e(s)
         })
       })
     }
     get(t) {
       return this.send.call(this.env, t)
     }
     post(t) {
       return this.send.call(this.env, t, "POST")
     }
   }
   return new class {
     constructor(t, e) {
       this.name = t,
       this.http = new s(this),
       this.data = null,
       this.dataFile = "box.dat",
       this.logs = [],
       this.isMute = !1,
       this.isNeedRewrite = !1,
       this.logSeparator = "\n",
       this.startTime = (new Date).getTime(),
       Object.assign(this, e),
       this.log("", `\ud83d\udd14${this.name}, \u5f00\u59cb!`)
     }
     isNode() {
       return "undefined" != typeof module && !!module.exports
     }
     isQuanX() {
       return "undefined" != typeof $task
     }
     isSurge() {
       return "undefined" != typeof $httpClient && "undefined" == typeof $loon
     }
     isLoon() {
       return "undefined" != typeof $loon
     }
     toObj(t, e = null) {
       try {
         return JSON.parse(t)
       } catch {
         return e
       }
     }
     toStr(t, e = null) {
       try {
         return JSON.stringify(t)
       } catch {
         return e
       }
     }
     getjson(t, e) {
       let s = e;
       const i = this.getdata(t);
       if (i)
         try {
           s = JSON.parse(this.getdata(t))
         } catch {}
       return s
     }
     setjson(t, e) {
       try {
         return this.setdata(JSON.stringify(t), e)
       } catch {
         return !1
       }
     }
     getScript(t) {
       return new Promise(e => {
         this.get({
           url: t
         }, (t, s, i) => e(i))
       })
     }
     runScript(t, e) {
       return new Promise(s => {
         let i = this.getdata("@chavy_boxjs_userCfgs.httpapi");
         i = i ? i.replace(/\n/g, "").trim() : i;
         let r = this.getdata("@chavy_boxjs_userCfgs.httpapi_timeout");
         r = r ? 1 * r : 20,
         r = e && e.timeout ? e.timeout : r;
         const[o, h] = i.split("@"),
         a = {
           url: `http://${h}/v1/scripting/evaluate`,
           body: {
             script_text: t,
             mock_type: "cron",
             timeout: r
           },
           headers: {
             "X-Key": o,
             Accept: "*/*"
           }
         };
         this.post(a, (t, e, i) => s(i))
       }).catch(t => this.logErr(t))
     }
     loaddata() {
       if (!this.isNode())
         return {}; {
         this.fs = this.fs ? this.fs : require("fs"),
         this.path = this.path ? this.path : require("path");
         const t = this.path.resolve(this.dataFile),
         e = this.path.resolve(process.cwd(), this.dataFile),
         s = this.fs.existsSync(t),
         i = !s && this.fs.existsSync(e);
         if (!s && !i)
           return {}; {
           const i = s ? t : e;
           try {
             return JSON.parse(this.fs.readFileSync(i))
           } catch (t) {
             return {}
           }
         }
       }
     }
     writedata() {
       if (this.isNode()) {
         this.fs = this.fs ? this.fs : require("fs"),
         this.path = this.path ? this.path : require("path");
         const t = this.path.resolve(this.dataFile),
         e = this.path.resolve(process.cwd(), this.dataFile),
         s = this.fs.existsSync(t),
         i = !s && this.fs.existsSync(e),
         r = JSON.stringify(this.data);
         s ? this.fs.writeFileSync(t, r) : i ? this.fs.writeFileSync(e, r) : this.fs.writeFileSync(t, r)
       }
     }
     lodash_get(t, e, s) {
       const i = e.replace(/\[(\d+)\]/g, ".$1").split(".");
       let r = t;
       for (const t of i)
         if (r = Object(r)[t], void 0 === r)
           return s;
       return r
     }
     lodash_set(t, e, s) {
       return Object(t) !== t ? t : (Array.isArray(e) || (e = e.toString().match(/[^.[\]]+/g) || []), e.slice(0, -1).reduce((t, s, i) => Object(t[s]) === t[s] ? t[s] : t[s] = Math.abs(e[i + 1]) >> 0 == +e[i + 1] ? [] : {}, t)[e[e.length - 1]] = s, t)
     }
     getdata(t) {
       let e = this.getval(t);
       if (/^@/.test(t)) {
         const[, s, i] = /^@(.*?)\.(.*?)$/.exec(t),
         r = s ? this.getval(s) : "";
         if (r)
           try {
             const t = JSON.parse(r);
             e = t ? this.lodash_get(t, i, "") : e
           } catch (t) {
             e = ""
           }
       }
       return e
     }
     setdata(t, e) {
       let s = !1;
       if (/^@/.test(e)) {
         const[, i, r] = /^@(.*?)\.(.*?)$/.exec(e),
         o = this.getval(i),
         h = i ? "null" === o ? null : o || "{}" : "{}";
         try {
           const e = JSON.parse(h);
           this.lodash_set(e, r, t),
           s = this.setval(JSON.stringify(e), i)
         } catch (e) {
           const o = {};
           this.lodash_set(o, r, t),
           s = this.setval(JSON.stringify(o), i)
         }
       } else
         s = this.setval(t, e);
       return s
     }
     getval(t) {
       return this.isSurge() || this.isLoon() ? $persistentStore.read(t) : this.isQuanX() ? $prefs.valueForKey(t) : this.isNode() ? (this.data = this.loaddata(), this.data[t]) : this.data && this.data[t] || null
     }
     setval(t, e) {
       return this.isSurge() || this.isLoon() ? $persistentStore.write(t, e) : this.isQuanX() ? $prefs.setValueForKey(t, e) : this.isNode() ? (this.data = this.loaddata(), this.data[e] = t, this.writedata(), !0) : this.data && this.data[e] || null
     }
     initGotEnv(t) {
       this.got = this.got ? this.got : require("got"),
       this.cktough = this.cktough ? this.cktough : require("tough-cookie"),
       this.ckjar = this.ckjar ? this.ckjar : new this.cktough.CookieJar,
       t && (t.headers = t.headers ? t.headers : {}, void 0 === t.headers.Cookie && void 0 === t.cookieJar && (t.cookieJar = this.ckjar))
     }
     get(t, e = (() => {})) {
       t.headers && (delete t.headers["Content-Type"], delete t.headers["Content-Length"]),
       this.isSurge() || this.isLoon() ? (this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
             "X-Surge-Skip-Scripting": !1
           })), $httpClient.get(t, (t, s, i) => {
           !t && s && (s.body = i, s.statusCode = s.status),
           e(t, s, i)
         })) : this.isQuanX() ? (this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
             hints: !1
           })), $task.fetch(t).then(t => {
           const {
             statusCode: s,
             statusCode: i,
             headers: r,
             body: o
           } = t;
           e(null, {
             status: s,
             statusCode: i,
             headers: r,
             body: o
           }, o)
         }, t => e(t))) : this.isNode() && (this.initGotEnv(t), this.got(t).on("redirect", (t, e) => {
           try {
             if (t.headers["set-cookie"]) {
               const s = t.headers["set-cookie"].map(this.cktough.Cookie.parse).toString();
               this.ckjar.setCookieSync(s, null),
               e.cookieJar = this.ckjar
             }
           } catch (t) {
             this.logErr(t)
           }
         }).then(t => {
           const {
             statusCode: s,
             statusCode: i,
             headers: r,
             body: o
           } = t;
           e(null, {
             status: s,
             statusCode: i,
             headers: r,
             body: o
           }, o)
         }, t => {
           const {
             message: s,
             response: i
           } = t;
           e(s, i, i && i.body)
         }))
     }
     post(t, e = (() => {})) {
       if (t.body && t.headers && !t.headers["Content-Type"] && (t.headers["Content-Type"] = "application/x-www-form-urlencoded"), t.headers && delete t.headers["Content-Length"], this.isSurge() || this.isLoon())
         this.isSurge() && this.isNeedRewrite && (t.headers = t.headers || {}, Object.assign(t.headers, {
             "X-Surge-Skip-Scripting": !1
           })), $httpClient.post(t, (t, s, i) => {
           !t && s && (s.body = i, s.statusCode = s.status),
           e(t, s, i)
         });
       else if (this.isQuanX())
         t.method = "POST", this.isNeedRewrite && (t.opts = t.opts || {}, Object.assign(t.opts, {
             hints: !1
           })), $task.fetch(t).then(t => {
           const {
             statusCode: s,
             statusCode: i,
             headers: r,
             body: o
           } = t;
           e(null, {
             status: s,
             statusCode: i,
             headers: r,
             body: o
           }, o)
         }, t => e(t));
       else if (this.isNode()) {
         this.initGotEnv(t);
         const {
           url: s,
           ...i
         } = t;
         this.got.post(s, i).then(t => {
           const {
             statusCode: s,
             statusCode: i,
             headers: r,
             body: o
           } = t;
           e(null, {
             status: s,
             statusCode: i,
             headers: r,
             body: o
           }, o)
         }, t => {
           const {
             message: s,
             response: i
           } = t;
           e(s, i, i && i.body)
         })
       }
     }
     time(t) {
       let e = {
         "M+": (new Date).getMonth() + 1,
         "d+": (new Date).getDate(),
         "H+": (new Date).getHours(),
         "m+": (new Date).getMinutes(),
         "s+": (new Date).getSeconds(),
         "q+": Math.floor(((new Date).getMonth() + 3) / 3),
         S: (new Date).getMilliseconds()
       };
       /(y+)/.test(t) && (t = t.replace(RegExp.$1, ((new Date).getFullYear() + "").substr(4 - RegExp.$1.length)));
       for (let s in e)
         new RegExp("(" + s + ")").test(t) && (t = t.replace(RegExp.$1, 1 == RegExp.$1.length ? e[s] : ("00" + e[s]).substr(("" + e[s]).length)));
       return t
     }
     msg(e = t, s = "", i = "", r) {
       const o = t => {
         if (!t)
           return t;
         if ("string" == typeof t)
           return this.isLoon() ? t : this.isQuanX() ? {
             "open-url": t
           }
          : this.isSurge() ? {
           url: t
         }
          : void 0;
         if ("object" == typeof t) {
           if (this.isLoon()) {
             let e = t.openUrl || t.url || t["open-url"],
             s = t.mediaUrl || t["media-url"];
             return {
               openUrl: e,
               mediaUrl: s
             }
           }
           if (this.isQuanX()) {
             let e = t["open-url"] || t.url || t.openUrl,
             s = t["media-url"] || t.mediaUrl;
             return {
               "open-url": e,
               "media-url": s
             }
           }
           if (this.isSurge()) {
             let e = t.url || t.openUrl || t["open-url"];
             return {
               url: e
             }
           }
         }
       };
       this.isMute || (this.isSurge() || this.isLoon() ? $notification.post(e, s, i, o(r)) : this.isQuanX() && $notify(e, s, i, o(r)));
       let h = ["", "==============\ud83d\udce3\u7cfb\u7edf\u901a\u77e5\ud83d\udce3=============="];
       h.push(e),
       s && h.push(s),
       i && h.push(i),
       console.log(h.join("\n")),
       this.logs = this.logs.concat(h)
     }
     log(...t) {
       t.length > 0 && (this.logs = [...this.logs, ...t]),
       console.log(t.join(this.logSeparator))
     }
     logErr(t, e) {
       const s = !this.isSurge() && !this.isQuanX() && !this.isLoon();
       s ? this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t.stack) : this.log("", `\u2757\ufe0f${this.name}, \u9519\u8bef!`, t)
     }
     wait(t) {
       return new Promise(e => setTimeout(e, t))
     }
     done(t = {}) {
       const e = (new Date).getTime(),
       s = (e - this.startTime) / 1e3;
       this.log("", `\ud83d\udd14${this.name}, \u7ed3\u675f! \ud83d\udd5b ${s} \u79d2`),
       this.log(),
       (this.isSurge() || this.isQuanX() || this.isLoon()) && $done(t)
     }
   }
   (t, e)
 }
 